package jp.co.nes.awssupport.business.logic.description;

import org.apache.commons.lang3.StringUtils;

import jp.co.nes.awssupport.business.bean.BillingCsvBean;
import jp.co.nes.awssupport.common.bean.ReservedManageBean;

/**
 * ElasticsearchService用の説明作成です。
 */
public class AmazonElasticsearchServiceDescriptionImpl extends BaseDescriptionImpl {

    /** インスタンスタイプにサフィックスが必要と判断する使用タイプの一部分 */
    protected static final String ESINSTANCE = "ESInstance";

    /** インスタンスタイプに追加するサフィックス */
    protected static final String SUFFIX_INSTANCE_TYPE_VALUE = ".elasticsearch";

    /**
     * デフォルトコンストラクタです。
     */
    public AmazonElasticsearchServiceDescriptionImpl() {
    }

    /*
     * (非 Javadoc)
     * @see jp.co.nes.awssupport.business.logic.description.BaseDescriptionImpl#createDescriptionForReserved(jp.co.nes.awssupport.business.bean.BillingCsvBean, jp.co.nes.awssupport.common.bean.ReservedManageBean)
     */
    @Override
    protected String createDescriptionForReserved(BillingCsvBean csvBean, ReservedManageBean rmBean) {
        String result = getDefaultDescriptionValue(csvBean);

        String productName = csvBean.getProductName();

        String regionCode = rmBean.getRegionCode();

        String reservedInstanceValue = getReservedInstanceValue(productName);
        if (reservedInstanceValue == null) {
            addWarnMessage(csvBean);
            return result;
        }

        String instanceTypeValue = getInstanceTypeValue(csvBean.getUsageType(), rmBean.getInstanceType());
        if (instanceTypeValue == null) {
            addWarnMessage(csvBean);
            return result;
        }

        String durationValue = descriptionInfoHelper.get(productName, Integer.toString(rmBean.getDuration()));
        if (durationValue == null) {
            addWarnMessage(csvBean);
            return result;
        }

        String offeringTypeValue = descriptionInfoHelper.get(productName, rmBean.getOfferingType());
        if (offeringTypeValue == null) {
            addWarnMessage(csvBean);
            return result;
        }

        String lineItemTypeValue = getLineItemTypeValueForReserved(productName, csvBean.getLineItemType());
        if (lineItemTypeValue == null) {
            addWarnMessage(csvBean);
            return result;
        }

        StringBuilder builder = new StringBuilder();
        builder.append(getDescriptionPrefix(regionCode));
        builder.append(reservedInstanceValue);
        builder.append(FWC).append(instanceTypeValue);
        builder.append(FWC).append(durationValue);
        builder.append(FWC).append(offeringTypeValue);
        builder.append(FWC).append(lineItemTypeValue);
        result = builder.toString();
        return result;
    }

    /**
     * インスタンスタイプにサフィックスを追加する必要がある場合、使用タイプにサフィックスを追加して返却します。<br>
     * 追加する必要がない場合は、使用タイプそのままの内容を返却します。
     *
     * @param usageType 使用タイプ
     * @param instanceType インスタンスタイプ
     * @return インスタンスタイプに関する文字列
     */
    protected String getInstanceTypeValue(String usageType, String instanceType) {
        String result = instanceType;
        if (!StringUtils.isEmpty(usageType)) {
            if (usageType.indexOf(ESINSTANCE) >= 0 && !usageType.endsWith(SUFFIX_INSTANCE_TYPE_VALUE)) {
                result = result + SUFFIX_INSTANCE_TYPE_VALUE;
            }
        }
        return result;
    }

    /*
     * (非 Javadoc)
     * @see jp.co.nes.awssupport.business.logic.description.BaseDescriptionImpl#buildDescriptionFromUsageType(java.lang.String, java.lang.String, jp.co.nes.awssupport.business.logic.description.BaseDescriptionImpl.UsageTypeTokenizer)
     */
    @Override
    protected String buildDescriptionFromUsageType(String regionCode, String productName,
            UsageTypeTokenizer usageTypeTokenizer) {
        String kindValue = descriptionInfoHelper.get(productName, usageTypeTokenizer.getKind());
        String instanceType = usageTypeTokenizer.getInstanceType();
        String operation = usageTypeTokenizer.getOperation();
        String operationValue = descriptionInfoHelper.get(productName, operation);
        if (operationValue == null && operation != null) {
            return null;
        }

        StringBuilder builder = new StringBuilder();
        if (kindValue != null && instanceType != null) {
            builder.append(regionCode).append("-");
            builder.append(kindValue);
            builder.append("：");
            if (operationValue != null) {
                builder.append(operationValue);
                builder.append("：");
            }
            builder.append(instanceType);
            if (kindValue.equals(ESINSTANCE)) {
                builder.append(SUFFIX_INSTANCE_TYPE_VALUE);
            }
        }
        return builder.toString();
    }
}
